package utils.config
{
	import flash.desktop.NativeApplication;
	import flash.filesystem.File;
	
	import utils.filemanager.MyFileWriter;
	import utils.log.LOGGER;

	/** 
	 * Die Klasse Config erzeugt lokal im Nutzerverzeichnis
	 * eine XML-Datei, in der die Einstellungen der Anwendung gespeichert werden.
	 * Diese können leicht durch Ändern der XML Datei persitent angepasst werden.
	 * Zu den Einstellungen gehören, die aktuelle Version der App, das Flag zum Vollbild, der Anfangszustand der Anwendung
	 * und ob NFC angeschaltet ist oder nicht
	 */
	
	
	public class Config
	{
		
		private var appVersion:		String;
		private var fullScreen: 	Boolean;
		private var initialState:	String;
		private var enableNFC:		Boolean;
		
		
		public function Config(appVersion:String, fullScreen:Boolean, initialState:String, enableNFC:Boolean){
			this.appVersion			= appVersion;	
			this.fullScreen			= fullScreen;
			this.initialState		= initialState;
			this.enableNFC			= enableNFC;
			
		}

		private function toXML():XML{
			var config:XML = <config/>;
			config.appVersion				= appVersion;
			config.initialState				= initialState;
			config.enableNFC				= enableNFC;
			
			// comments
			config.insertChildBefore(config.appVersion,"/* Gibt die Version der Anwendung unter der diese config.xml erstellt wurde*/");
			config.insertChildBefore(config.fullScreen,"/* Gibt an, ob die Anwendung im Fullscreen gestartet werden soll*/");
			config.insertChildBefore(config.initialState,"/* Gibt Startzustand der Anwendung an*/");
			config.insertChildBefore(config.enableNFC,"/* Gibt an, ob NFC verwendet wird oder nicht*/");
			return config;
		}
		
		private static function getSettings():XML{
			if (File.applicationStorageDirectory.resolvePath("config/config.xml").exists)
				return new XML(MyFileWriter.read(File.applicationStorageDirectory.nativePath.toString()+"/config/config.xml"));
			else{
				LOGGER.log("config.xml nicht gefunden, wird erzeugt....");
				generateNewSettingsFile();
				return new XML(MyFileWriter.read(File.applicationStorageDirectory.nativePath.toString()+"/config/config.xml"));
			}
		}
		
		
		public static function generateNewSettingsFile(initialState:String = "MainState"):void{
			var appVersion:String = getInstalledAppVersion(); 
			MyFileWriter.writeConfigToSettings(new Config(getInstalledAppVersion(),true,initialState,true).toXML());
		}

		public static function getInstalledAppVersion():String {
			var appXml:XML = NativeApplication.nativeApplication.applicationDescriptor;
			var ns:Namespace = appXml.namespace();
			var appVersion:String = appXml.ns::versionNumber[0];
			return appVersion;
		}
		
		public static function getInstalledAppVersionNumber():int {
			var appVersion:String = getInstalledAppVersion();
			var versionNumber:int= 0;
			var intArray:Array = appVersion.split(".");
			for (var i:int = 0; i < intArray.length; i++) 
			{
				versionNumber+= intArray[i] * Math.pow(10,intArray.length-1-i);	
			}
			
			return versionNumber;
		}
		
		
		public static function getInitialState():String{
			return getSettings().initialState;
		}
		
		public static function getLastAppVersion():String{
			return  getSettings().appVersion;
		}
		
		public static function isFullScreen():Boolean{
			return getSettings().fullScreen;
		}
		
		public static function isNfcEnabled():Boolean{
			var xml:XML = getSettings();
			if(xml.enableNFC == "true"){
				return true;
			}else{
				return false;
			}
		}
		
		
		public static function getLastAppVersionNumber():int{
			var appVersion:String = getLastAppVersion();
			
			var versionNumber:int= 0;
			var intArray:Array = appVersion.split(".");
			for (var i:int = 0; i < intArray.length; i++) 
			{
				versionNumber+= intArray[i] * Math.pow(10,intArray.length-1-i);	
			}
			
			return versionNumber;
		}
		
		
	}
}